﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class ObjektGabeleiste
    Dim KO As ObjektKO
    Shared Gabesterne() As Texture = {}
    Dim SternPositionen() As Point = {}
    Dim StartPosition As Point
    Const FrameMax As Integer = 12
    Const Font As Integer = 3
    Private Frames As Integer
    Dim SternPositionAenderungsRichtung As Integer() = {}
    Enum Fuellung
        Leer
        Halbvoll
        Voll
    End Enum
    Public Property Frame() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
            If Frames > FrameMax Then
                Frames = 0
            End If
        End Set
    End Property
    Public Sub New(ByVal neuKO As ObjektKO, ByVal Position As Point)
        KO = neuKO
        If KO Is Nothing Then KO = New KOAndy(0)
        StartPosition = Position
        If Gabesterne.Length = 0 Then
            Array.Resize(Gabesterne, 6)
            Gabesterne(0) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Objects\Sternklein.png")
            Gabesterne(1) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Objects\SternKleinHalbvoll.png")
            Gabesterne(2) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Objects\SternKleinVoll.png")
            Gabesterne(3) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Objects\SternGross.png")
            Gabesterne(4) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Objects\SternGrossHalbvoll.png")
            Gabesterne(5) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Objects\SternGrossVoll.png")
        End If
        Array.Resize(SternPositionen, KO.Gabekosten + KO.SpezialgabeKosten)
        Array.Resize(SternPositionAenderungsRichtung, KO.Gabekosten + KO.SpezialgabeKosten)

        For I = 0 To KO.Gabekosten - 1
            SternPositionen(I) = Position
            Position.X += 9
            SternPositionAenderungsRichtung(I) = 1
        Next
        Position.Y -= 2
        For I2 = 0 To KO.SpezialgabeKosten - 1
            SternPositionen(I2 + KO.Gabekosten) = Position
            Position.X += 10
            SternPositionAenderungsRichtung(I2 + KO.Gabekosten) = 1
        Next

    End Sub
    Public Sub Malen()
        If Objektverwalter.Spielfeld.Spieler(KO.Spieler).Gabeleiste Then
            If Objektverwalter.Spielfeld.AktuellerSpieler.Team <> Objektverwalter.Spielfeld.Spieler(KO.Spieler).Team And KO.GabeleistenVerstecker = True Then
                'Manche KOS verstecken ihre Gabeleisten wir malen nichts =).
            Else
                For I = 0 To SternPositionen.Length - 1
                    If I >= KO.Gabekosten Then
                        If StartPosition.Y - 2 - SternPositionen(I).Y < -1 Then
                            SternPositionen(I).Y = StartPosition.Y - 2
                        ElseIf StartPosition.Y - 2 - SternPositionen(I).Y > 4 Then
                            SternPositionen(I).Y = StartPosition.Y - 2
                        End If
                    Else
                        If StartPosition.Y - SternPositionen(I).Y < -1 Then
                            SternPositionen(I).Y = StartPosition.Y
                        ElseIf StartPosition.Y - SternPositionen(I).Y > 4 Then
                            SternPositionen(I).Y = StartPosition.Y
                        End If
                    End If
                   
                Next
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                Grafikengine.ptfRotCenter = Nothing
                If KO.Gabemodus = ObjektKO.Gabemodi.Keine Then
                    With Grafikengine.szfScale
                        .Height = 8
                        .Width = 8
                    End With
                    With Grafikengine.ptfRotCenter
                        .X = 0
                        .Y = 0
                    End With
                    Dim SpezialGabeStart As Integer
                    Dim Aenderung As Integer = 0
                    If KO.KannGabe Then
                        If KO.Gabekosten > 1 Then
                            If SternPositionen(0).Y = SternPositionen(1).Y Then
                                Dim Y As Integer = 0
                                Dim GAenderung As Integer = 1
                                For I = 1 To KO.Gabekosten
                                    SternPositionen(I - 1).Y -= Y
                                    Y += GAenderung
                                    If Y >= 3 Then
                                        GAenderung -= 1
                                    ElseIf Y <= 0 Then
                                        GAenderung = 1
                                    End If
                                Next
                            End If
                        End If
                    End If
                    If KO.KannSpezialGabe Then
                        If KO.SpezialgabeKosten > 1 Then
                            If SternPositionen(KO.Gabekosten).Y = SternPositionen(KO.Gabekosten + 1).Y Then
                                Dim Y As Integer = 0
                                If KO.Gabekosten > 0 Then
                                    Y = StartPosition.Y - SternPositionen(KO.Gabekosten - 1).Y - 2
                                Else
                                    Y = 0
                                End If
                                Dim GAenderung As Integer = 1
                                For I = 1 To KO.SpezialgabeKosten
                                    If Y >= 3 Then
                                        GAenderung -= 1
                                    ElseIf Y <= 0 Then
                                        GAenderung = 1
                                    End If
                                    Y += GAenderung
                                    SternPositionen(I - 1 + KO.Gabekosten).Y -= Y
                                Next
                            End If
                        End If
                    End If
                    For I = 1 To KO.Gabekosten
                        Dim Fuellgrad As Fuellung = Fuellung.Leer
                        If KO.Gabeleiste - I * KO.Sternkosten >= 0 Then
                            Fuellgrad = Fuellung.Voll
                        ElseIf KO.Gabeleiste - (I - 1) * KO.Sternkosten - KO.Sternkosten / 2 >= 0 Then
                            Fuellgrad = Fuellung.Halbvoll
                        End If
                        If Fuellgrad > 0 Then
                            With Grafikengine.recBild
                                .X = 8 * Frame : .Width = 8
                                .Y = 0 : .Height = 8
                            End With
                        Else
                            With Grafikengine.recBild
                                .X = 0 : .Width = 8
                                .Y = 0 : .Height = 8
                            End With
                        End If
                        Grafikengine.ptfPosition = SternPositionen(I - 1)
                        If KO.KannGabe Then
                            Dim Y As Integer = StartPosition.Y - SternPositionen(I - 1).Y
                            If Y + SternPositionAenderungsRichtung(I - 1) >= 3 Then
                                SternPositionAenderungsRichtung(I - 1) = +1
                            ElseIf Y + SternPositionAenderungsRichtung(I - 1) <= 0 Then
                                SternPositionAenderungsRichtung(I - 1) = -1
                            End If
                            SternPositionen(I - 1).Y += SternPositionAenderungsRichtung(I - 1)
                        Else
                            SternPositionen(I - 1).Y = StartPosition.Y
                        End If

                        Grafikengine.Sprite.Draw2D(Gabesterne(Fuellgrad), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                        SpezialGabeStart = I
                    Next
                    With Grafikengine.szfScale
                        .Height = 10
                        .Width = 9
                    End With
                    Aenderung = 0
                    For I = 1 To KO.SpezialgabeKosten
                        Dim Fuellgrad As Fuellung = Fuellung.Leer
                        If KO.Gabeleiste - (I + KO.Gabekosten) * KO.Sternkosten >= 0 Then
                            Fuellgrad = Fuellung.Voll
                        ElseIf KO.Gabeleiste - (I - 1 + KO.Gabekosten) * KO.Sternkosten - KO.Sternkosten / 2 >= 0 Then
                            Fuellgrad = Fuellung.Halbvoll
                        End If
                        If Fuellgrad > 0 Then
                            With Grafikengine.recBild
                                .X = 9 * Frame : .Width = 9
                                .Y = 0 : .Height = 10
                            End With
                        Else
                            With Grafikengine.recBild
                                .X = 0 : .Width = 9
                                .Y = 0 : .Height = 10
                            End With
                        End If
                        Grafikengine.ptfPosition = SternPositionen(I - 1 + KO.Gabekosten)
                        If KO.KannSpezialGabe Then
                            Dim Y As Integer = StartPosition.Y - 2 - SternPositionen(I - 1 + KO.Gabekosten).Y
                            If Y + SternPositionAenderungsRichtung(I - 1 + KO.Gabekosten) >= 3 Then
                                SternPositionAenderungsRichtung(I - 1 + KO.Gabekosten) = +1
                            ElseIf Y + SternPositionAenderungsRichtung(I - 1 + KO.Gabekosten) <= 0 Then
                                SternPositionAenderungsRichtung(I - 1 + KO.Gabekosten) = -1
                            End If
                            SternPositionen(I - 1 + KO.Gabekosten).Y += SternPositionAenderungsRichtung(I - 1 + KO.Gabekosten)
                        Else
                            SternPositionen(I - 1 + KO.Gabekosten).Y = StartPosition.Y - 2
                        End If
                        Grafikengine.Sprite.Draw2D(Gabesterne(Fuellgrad + 3), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

                    Next
                ElseIf KO.Gabemodus = ObjektKO.Gabemodi.Gabe Then
                    Dim Gabetext As String = Sprachconverter.Translate("GABE")
                    Grafikengine.ptfPosition = StartPosition
                    Grafikengine.ptfPosition.Y -= 2
                    If SternPositionen(0).X > SternPositionen(1).X Then
                        Grafikengine.ptfPosition.X -= 26
                    End If

                    Dim W As Integer = ObjektAlphabet.GetFontDimension(Font).Width
                    For I = 0 To Gabetext.Length - 1
                        ObjektAlphabet.DrawString(Gabetext(I), 1, Grafikengine.ptfPosition, Font, GetGabenFarbe(I + Frame))
                        Grafikengine.ptfPosition.X += W
                    Next

                ElseIf KO.Gabemodus = ObjektKO.Gabemodi.Spezialgabe Then
                    Dim Gabetext As String = Sprachconverter.Translate("SPEZIAL")
                    Grafikengine.ptfPosition = StartPosition
                    Grafikengine.ptfPosition.Y -= 2
                    If SternPositionen(0).X > SternPositionen(1).X Then
                        Grafikengine.ptfPosition.X -= 46
                    End If
                    Dim W As Integer = ObjektAlphabet.GetFontDimension(Font).Width
                    For I = 0 To Gabetext.Length - 1
                        ObjektAlphabet.DrawString(Gabetext(I), 1, Grafikengine.ptfPosition, Font, GetGabenFarbe(I + Frame))
                        Grafikengine.ptfPosition.X += W
                    Next
                ElseIf KO.Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                    Grafikengine.ptfPosition = StartPosition
                    Grafikengine.ptfPosition.Y -= 2
                    If SternPositionen(0).X > SternPositionen(1).X Then
                        Grafikengine.ptfPosition.X -= 53
                    End If
                    Dim StartX As Integer = Grafikengine.ptfPosition.X
                    Dim Gabetext As String = Sprachconverter.Translate("DOPPEL")
                    Dim W As Size = ObjektAlphabet.GetFontDimension(Font)
                    For I = 0 To Gabetext.Length - 1
                        ObjektAlphabet.DrawString(Gabetext(I), 1, Grafikengine.ptfPosition, Font, GetGabenFarbe(I + Frame))
                        Grafikengine.ptfPosition.X += W.Width
                    Next
                    Gabetext = Sprachconverter.Translate("GABE")

                    Grafikengine.ptfPosition.Y += W.Height * 3
                    Grafikengine.ptfPosition.X = StartX
                    For I = 0 To Gabetext.Length - 1
                        ObjektAlphabet.DrawString(Gabetext(I), 1, Grafikengine.ptfPosition, Font, GetGabenFarbe(I + Frame))
                        Grafikengine.ptfPosition.X += W.Width
                    Next
                End If
                Frame = 2
            End If
        End If
    End Sub
    ''' <summary>
    ''' Hardcode um die Schriftfarbe zu erhalten.
    ''' </summary>
    ''' <param name="Frame"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetGabenFarbe(ByVal Frame As Integer) As Integer
        While Frame > FrameMax
            Frame -= FrameMax
        End While
        Select Case Frame
            Case 0
                Return Color.FromArgb(255, 248, 152, 0).ToArgb
            Case 1
                Return Color.FromArgb(255, 248, 176, 0).ToArgb
            Case 2
                Return Color.FromArgb(255, 248, 248, 0).ToArgb
            Case 3
                Return Color.FromArgb(255, 248, 248, 24).ToArgb
            Case 4
                Return Color.FromArgb(255, 248, 248, 176).ToArgb
            Case 5
                Return Color.FromArgb(255, 248, 232, 208).ToArgb
            Case 6
                Return Color.FromArgb(255, 248, 216, 176).ToArgb
            Case 7
                Return Color.FromArgb(255, 248, 184, 104).ToArgb
            Case 8
                Return Color.FromArgb(255, 248, 160, 64).ToArgb
            Case 9
                Return Color.FromArgb(255, 248, 128, 0).ToArgb
            Case 10
                Return Color.FromArgb(255, 248, 51, 0).ToArgb
            Case 11
                Return Color.FromArgb(255, 248, 128, 0).ToArgb
            Case Else
                Return Color.FromArgb(255, 248, 160, 64).ToArgb
        End Select
    End Function

    Public Sub Spiegeln(ByVal X As Integer)
        Dim Position As New Point(X, StartPosition.Y)
        StartPosition = Position
        If SternPositionen.Length > 1 Then
            If SternPositionen(0).X < SternPositionen(1).X Then
                For I = 0 To KO.Gabekosten - 1
                    SternPositionen(I) = Position
                    Position.X -= 9
                Next
                Position.Y -= 2
                For I2 = 0 To KO.SpezialgabeKosten - 1
                    SternPositionen(I2 + KO.Gabekosten) = Position
                    Position.X -= 10
                Next

            Else
                For I = 0 To KO.Gabekosten - 1
                    SternPositionen(I) = Position
                    Position.X += 9
                Next
                Position.Y -= 2
                For I2 = 0 To KO.SpezialgabeKosten - 1
                    SternPositionen(I2 + KO.Gabekosten) = Position
                    Position.X += 10
                Next

            End If
        End If
    End Sub
End Class
